#ifndef Y_LLIST_H
#define Y_LLIST_H

enum {
	HEAD = -10,
	TAIL,
	MINHEAD,
	MAXHEAD,
	THRD_SAFE,
	THRD_NSAFE
};

typedef void LLIST;
typedef int cmp_func_t(void *, void *);
typedef void travel_func_t(void *);

LLIST *llist_init(int way, int size);
void llist_destroy(LLIST *);
int llist_insert(LLIST *, void *data, cmp_func_t *cmp, int mode);
int llist_delete(LLIST *, void *key, cmp_func_t *cmp);
void llist_travel(LLIST *, travel_func_t *);
void *llist_find__(LLIST *head, void *key, cmp_func_t *cmp);
int llist_find(LLIST *, void *key, cmp_func_t *cmp, void *ret);
int llist_sort(LLIST *, cmp_func_t *cmp, int mode);
int llist_fetch(LLIST *head, void *key, cmp_func_t *cmp, void *data);
int llist_fetch_head(LLIST *head, void *data);
int llist_modify_node(LLIST *head, void *key, cmp_func_t *cmp, void *modify);
int llist_empty(LLIST *);
int llist_isempty(LLIST *);
int llist_number(LLIST *);

#endif
